import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getTimeStamp } from '@/utils/auth'
// 导入进度条插件\js与css
import NProgress from 'nprogress'
import 'nprogress/nprogress.css' // 导入样式，否则看不到效果

// 定义超时时间 3600秒
const TimeOut = 3600
// 定义一个判断是否超时的函数
// 超时逻辑  (当前时间  - 缓存中的时间) 是否大于 时间差，大于就表示过期了。
function isCheckTimeOut() {
  const currentTime = Date.now()
  const stampTime = getTimeStamp()
  return (currentTime - stampTime) / 1000 > TimeOut
}

const instance = axios.create({
  // 当执行 npm run dev -> .env.development文件 -> /api -> 触发跨域代理
  baseURL: process.env.VUE_APP_BASE_API // 根据执行的命令不同， process.env.VUE_APP_BASE_API的值不一样。这里我们只需要配置开发服务器。
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    NProgress.start()
    // 在发送请求之前做些什么
    // 统一携带token
    if (store.getters.token) {
      if (isCheckTimeOut()) {
        // 如果为true，表示过期了
        // 清除token，清除用户信息，跳转到登录页
        store.commit('user/removeTokenHandler')
        store.commit('user/updateUserInfoHandler', {})
        router.replace('/login')
        return Promise.reject(new Error('token超时了'))
      }
      config.headers.Authorization = `Bearer ${store.getters.token}`
    }

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    NProgress.done()
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    // if (!response.data.success) return Message.error(response.data.message) // 提示错误信息
    return response.data
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么

    // error 信息 里面 response的对象
    // token过期的被动处理
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      // 当等于10002的时候 表示 后端告诉我token超时了
      // 清除token，清除用户信息，跳转到登录页
      store.commit('user/removeTokenHandler')
      store.commit('user/updateUserInfoHandler', {})
      router.replace('/login')
    } else {
      Message.error(error.message) // 提示错误信息
    }
    return Promise.reject(error)
  }
)

export default instance
